package Logikk;

import Beans.Deltaker;
import DB.DBehandler;
import java.io.Serializable;
import java.util.*;
import javax.faces.model.SelectItem;

/**
 * Klasse som henter inn og tar vare på alle deltakere
 * @author Gruppe1
 */

public class AlleDeltakere implements Serializable{
    ArrayList<Deltaker> alleDeltakere = new ArrayList<Deltaker>();
    Deltaker deltaker = new Deltaker();
    DBehandler db = new DBehandler();
    
    /**
     * Lagrer deltakerne, setter deltakerlisten til ikke redigerbar for deretter å kalle updateDeltaker() fra DBhandler
     * @return ingenting
     */
    public String save(){
        for(Deltaker r : alleDeltakere){
            r.setEditable(false);
            db.updateDeltaker(r);
        }
        return null;
    }
    
    /**
     * Hent alle deltakere som arrayList
     * @return arrayList med alleDeltakere
     */
    public ArrayList<Deltaker> getAlleDeltakere(){
        return alleDeltakere;
    }
    
    /**
     * Finner alle brukere og plasserer de i SelectItem liste.
     * @return SelectItem liste med alleDeltakere samt all info
     */
    public SelectItem[] finnAlleBrukereSelect(){
        SelectItem[]hjelpe = new SelectItem[alleDeltakere.size()];
        for(int i = 0 ; i < alleDeltakere.size() ; i++)
            hjelpe[i] = new SelectItem(alleDeltakere.get(i));
        return hjelpe;
    }
    
    /**
     * Henter ut alle deltakere, kopierer også over attributtet "editable"
     * @return ArrayList<Deltaker> med alleDeltakere
     */
    public ArrayList<Deltaker> hentAlleBrukere() {
        ArrayList<Deltaker> res = new ArrayList<Deltaker>();
        
        for (Deltaker r : alleDeltakere) {
            Deltaker d = new Deltaker();
            d.setAdresse(r.getAdresse());
            d.setDeltaker_id(r.getDeltaker_id());
            d.setEditable(r.isEditable());
            d.setEnavn(r.getEnavn());
            d.setEpost(r.getEpost());
            d.setFaar(r.getFaar());
            d.setFnavn(r.getFnavn());
            d.setKjonn(r.getKjonn());
            d.setPassord1(r.getPassord1());
            d.setPassord2(r.getPassord2());
            res.add(d);
        }
        alleDeltakere = db.hentAlleDeltakere();
        for (int i = 0; i < alleDeltakere.size(); i++) {
            for (int j = 0; j < res.size(); j++) {
                if (alleDeltakere.get(i).equals(res.get(j))) {
                    alleDeltakere.get(i).setEditable(res.get(j).isEditable());
                }
            }
        }
        
        return alleDeltakere;
    }
    /**
     * Henter ut en deltakere, kopierer også over attributtet "editable"
     * @return ArrayList<Deltaker> med denne deltakeren, sys får ut alle
     */
    public ArrayList<Deltaker> hentEnDeltaker() {
        ArrayList<Deltaker> res = new ArrayList<Deltaker>();
        
        for (Deltaker r : alleDeltakere) {
            Deltaker d = new Deltaker();
            d.setAdresse(r.getAdresse());
            d.setDeltaker_id(r.getDeltaker_id());
            d.setEditable(r.isEditable());
            d.setEnavn(r.getEnavn());
            d.setEpost(r.getEpost());
            d.setFaar(r.getFaar());
            d.setFnavn(r.getFnavn());
            d.setKjonn(r.getKjonn());
            d.setPassord1(r.getPassord1());
            d.setPassord2(r.getPassord2());
            res.add(d);
        }
        alleDeltakere = db.hentEnDeltaker();
        for (int i = 0; i < alleDeltakere.size(); i++) {
            for (int j = 0; j < res.size(); j++) {
                if (alleDeltakere.get(i).equals(res.get(j))) {
                    alleDeltakere.get(i).setEditable(res.get(j).isEditable());
                }
            }
        }
        
        return alleDeltakere;
    }

    /**
     * Hent en deltaker 
     * @return en deltaker
     */
    public Deltaker getDeltaker() {return deltaker;}
    /**
     * Sett deltaker
     * @param deltaker
     */
    public void setDeltaker(Deltaker deltaker) {this.deltaker = deltaker;}
        
    /**
     * Legger til deltaker til arraylista alleDeltakere
     * @param d
     * @return en tekst om legg til deltaker gikk bra samt om deltakeren fantes fra før
     */
    public String leggTilDeltaker(Deltaker d){
        if(deltakerUnique(d)){
            alleDeltakere.add(new Deltaker(d.getFnavn(), d.getEnavn(), d.getEpost(), d.getAdresse(), d.getFaar(), d.getKjonn(), d.getDeltaker_id()));
            return "legg_til_deltaker_OK";
        }
        else if(!deltakerUnique(d)){
            return "legg_til_deltaker_ikke_OK";
        }
        return "deltaker_finnes_fra_for";
    }
    
    private boolean deltakerUnique(Deltaker d){
        for(Deltaker a : alleDeltakere){
            if(a.getFnavn().equals(d.getFnavn()) && a.getEnavn().equals(d.getEnavn()) && a.getAdresse().equals(d.getAdresse()) && a.getFaar() == d.getFaar() && a.getKjonn().equals(d.getKjonn())) return false;
        }
        return true;
    }
}
